#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
//Teacher类 老师类
//Student类 学生类
//下课后，老师回触发一个信号：饿了>>>学生响应信号，请客吃饭


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建一个老师对象
    this->zt = new Teacher(this);
    //创建一个学生对象
    this->st = new Student(this);


    void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
    //在声明一个成员函数的地址时，需要把函数的作用域放到指针前面
    //所以*teacherSignal之前有一个Teacher::
    void(Student:: *studentSlot)(QString) = &Student::treat;
    //第一个括号是函数指针，第二个括号是参数
    //因为函数指针有参数，所以这时候这个函数指针明显地指向有参的hungry和treat函数

    connect(zt, teacherSignal, st, studentSlot);

//    //要求：点击一个下课的按钮，再触发下课
//    QPushButton *btn = new QPushButton("Class Over",this);
    //重置窗口大小
    this->resize(600,400);

//    //点击按钮，触发下课
//    connect(btn, &QPushButton::clicked, this, &Widget::classIsOver);


//    [=](){
//        btn->setText("aaaa");
//    }();//如果没有加上本行的小括号，则该Lambda表达式是函数声明
//    //如果加上了，则该Lambda表达式是一个完整的函数




//    //mutable关键字  用于修饰传递的变量，修改的是拷贝，而不是本体
//    QPushButton * myBtn = new QPushButton("1", this);
//    QPushButton * myBtn2 = new QPushButton("2", this);
//    myBtn2->move(200, 0);

//    int m = 10;

//    connect(myBtn, &QPushButton::clicked, this, [m]()mutable { m = 100 + 10;qDebug()<<m;});
//    //当加上mutable时，这里对m的任何修改都是对m的拷贝进行的操作，不会改变m本身的值

//    connect(myBtn2, &QPushButton::clicked, this, [=](){qDebug()<<m;});

//    qDebug()<<m;






//      //Lambda表达式，使用举例
//    int ret = []()->int{return 1000;}();//这里注意，最后要加上（），否则这将是一个声明，而不是函数本体
//    qDebug()<<"ret = "<<ret;




    //利用Lambda表达式，实现：点击按钮，关闭窗口
    QPushButton *btn2 = new QPushButton("Close", this);
    btn2->move(0, 100);

    //常用的关闭窗口的方法
    //connect(btn2, &QPushButton::clicked, this, &Widget::close);
    //利用Lambda表达式关闭窗口的方法
    connect(btn2, &QPushButton::clicked, this, [=](){//如果connect函数的第三个参数是this，那么第三个参数可以省略
//        //触发老师饿了的信号，并关闭窗口
//        this->close();
//        emit zt->hungry("宫保鸡丁");
        btn2->setText("别瞎点SB");
    });



    //Lambda表达式最常用形式：[=](){}



}

void Widget::classIsOver()
{
    //下课函数调用后，触发老师饿了的信号
    //emit zt->hungry();//emit某个信号，就相当于调用这个信号connect时所关联的槽函数
    emit zt->hungry("宫保鸡丁");
}

Widget::~Widget()
{
    delete ui;
}
